#!/bin/sh
# ====================================================================
# ZZW-Serial 应用管理脚本
# 功能：启动、停止和重启 ZZW-Serial Java 应用程序
# 支持的命令：start（启动）、stop（停止）、restart（重启）
# 注意：此脚本使用 killall java 命令会终止所有 Java 进程，存在安全风险
# ====================================================================

# ---------------------------------------------------------------------
# JAVA_OPTS 环境变量说明
# JAVA_OPTS 是一个用于配置 Java 虚拟机 (JVM) 参数的环境变量
# 通过设置这些参数，可以优化应用程序的性能、内存使用和运行行为
# ---------------------------------------------------------------------
# 设置 JAVA_OPTS 环境变量，包含常用的 JVM 参数
# 内存设置：
# -Xms256m: 初始堆内存大小为 256MB
# -Xmx512m: 最大堆内存大小为 512MB
# 垃圾收集器设置：
# -XX:+UseG1GC: 使用 G1 垃圾收集器，适合内存较大的应用
# -XX:MaxGCPauseMillis=200: 设置最大 GC 暂停时间为 200 毫秒
# 异常处理：
# -XX:+HeapDumpOnOutOfMemoryError: 当发生内存溢出时自动生成堆转储文件
# -XX:HeapDumpPath=/tmp: 指定堆转储文件的保存路径
# 编码设置：
# -Dfile.encoding=UTF-8: 设置文件编码为 UTF-8
# -Dsun.jnu.encoding=UTF-8: 设置 JNI 编码为 UTF-8
# 时区设置：
# -Duser.timezone=Asia/Shanghai: 设置时区为上海
JAVA_OPTS="-Xms256m -Xmx512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Duser.timezone=Asia/Shanghai"

# ---------------------------------------------------------------------
# 停止应用程序逻辑
# 当命令参数为 stop 或 restart 时执行停止操作
# ---------------------------------------------------------------------
# if 条件判断：检查第一个命令行参数 $1 是否为 "stop" 或 "restart"
# -o 是逻辑或运算符，用于连接两个条件
if [ "$1" = "stop" -o "$1" = "restart" ]
then                                                                             
    # 输出停止操作的提示信息到控制台
    echo "Stopping the java "
    
    # 使用 killall java 命令终止所有 Java 进程
    # 重要风险提示：
    # 1. 此命令会终止系统上所有运行中的 Java 进程
    # 2. 不仅限于 ZZW-Serial 应用，可能会影响其他 Java 应用的正常运行
    # 3. 在多 Java 应用环境中使用可能导致意外的服务中断
    killall java
fi  # 结束第一个 if 条件判断块

# ---------------------------------------------------------------------
# 启动应用程序逻辑
# 当命令参数为 start 或 restart 时执行启动操作
# ---------------------------------------------------------------------
# if 条件判断：检查第一个命令行参数 $1 是否为 "start" 或 "restart"
if [ "$1" = "start" -o "$1" = "restart" ]
then
    # 输出启动/重启操作的提示信息到控制台
    echo "Starting/Restarting the java "
    
    # 在启动前先终止所有 Java 进程
    # 这确保了在启动新实例前没有旧实例在运行
    # 同样存在终止所有 Java 进程的风险
    killall java
    
    # source /etc/profile 命令说明：
    # - 加载 /etc/profile 文件中的环境变量和配置
    # - 确保 Java 等程序的环境变量正确设置
    # - 避免因环境变量问题导致程序无法正常启动
    source /etc/profile
    
    # 启动 Java 应用程序的复合命令：
    # 1. cd /media/mmcblk0p1/jar 
    #    - 切换到应用程序所在目录
    #    - 确保应用在正确的工作目录下运行，可能影响相对路径引用
    #
    # 2. && 
    #    - 逻辑运算符，确保前一个命令成功执行后才执行后续命令
    #    - 如果目录切换失败，避免尝试启动应用
    #
    # 3. nohup 
    #    - "不挂断"命令，使程序在用户退出登录后继续运行
    #    - 忽略 SIGHUP 信号（终端关闭信号）
    #
    # 4. Java 可执行文件完整路径
    #    /media/mmcblk0p1/java/jdk1.8/jdk1.8.0_211/bin/java
    #    - 显式指定 Java 运行时环境，避免使用系统默认版本
    #
    # 5. $JAVA_OPTS
    #    - 使用前面定义的 JAVA_OPTS 环境变量
    #    - 包含所有 JVM 参数，使代码更整洁，便于维护
    #
    # 6. -jar 参数
    #    - 指示 Java 运行指定的 JAR 文件
    #    - ZZW-Serial.jar 是要运行的应用程序包
    #
    # 7. 输出重定向
    #    > /media/mmcblk0p1/jar/service.log - 将标准输出写入日志文件
    #    2>&1 - 将标准错误也重定向到标准输出（写入同一个日志文件）
    #
    # 8. & 
    #    - 将进程置于后台运行
    #    - 允许用户继续在终端执行其他命令
    cd /media/mmcblk0p1/jar && nohup /media/mmcblk0p1/java/jdk1.8/jdk1.8.0_211/bin/java $JAVA_OPTS -jar /media/mmcblk0p1/jar/ZZW-Serial.jar > /media/mmcblk0p1/jar/service.log 2>&1 &

    # JAVA_OPTS 使用说明：
    # 1. 为什么使用 JAVA_OPTS?
    #    - 集中管理所有 JVM 参数，提高代码可读性和可维护性
    #    - 方便修改参数而无需更改启动命令本身
    #    - 可以根据不同环境（开发、测试、生产）设置不同的参数集
    #
    # 2. 如何调整 JAVA_OPTS 参数?
    #    - 根据应用实际内存需求调整 -Xms 和 -Xmx 值
    #    - 生产环境中建议添加更多性能监控参数
    #    - 可以添加 GC 日志参数来监控垃圾回收情况
    #      例如: -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log
    #
    # 3. 注意事项：
    #    - 内存设置不要超过系统可用内存
    #    - 生产环境中建议进行参数调优以获得最佳性能
    #    - 对于不同的 Java 版本，某些参数可能需要调整
fi  # 结束第二个 if 条件判断块

# ====================================================================
# 使用方法：
# 1. 为脚本添加执行权限：chmod +x zzwSensor
# 2. 启动服务：./zzwSensor start
# 3. 停止服务：./zzwSensor stop
# 4. 重启服务：./zzwSensor restart
#
# 注意事项：
# 1. 脚本使用 killall java 命令会终止所有 Java 进程，请谨慎使用
# 2. 确保 /media/mmcblk0p1/jar 目录和 ZZW-Serial.jar 文件存在
# 3. 确保 Java 运行时环境路径正确
# 4. 服务启动后日志输出到 /media/mmcblk0p1/jar/service.log
# ====================================================================